{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "87455ddb",
   "metadata": {},
   "source": [
    "# Multi Input Tools\n",
    "\n",
    "This notebook shows how to use a tool that requires multiple inputs with an agent.\n",
    "\n",
    "The difficulty in doing so comes from the fact that an agent decides it's next step from a language model, which outputs a string. So if that step requires multiple inputs, they need to be parsed from that. Therefor, the currently supported way to do this is write a smaller wrapper function that parses that a string into multiple inputs.\n",
    "\n",
    "For a concrete example, let's work on giving an agent access to a multiplication function, which takes as input two integers. In order to use this, we will tell the agent to generate the \"Action Input\" as a comma separated list of length two. We will then write a thin wrapper that takes a string, splits it into two around a comma, and passes both parsed sides as integers to the multiplication function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "291149b6",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.llms import OpenAI\n",
    "from langchain.agents import initialize_agent, Tool"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71b6bead",
   "metadata": {},
   "source": [
    "Here is the multiplication function, as well as a wrapper to parse a string as input."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f0b82020",
   "metadata": {},
   "outputs": [],
   "source": [
    "def multiplier(a, b):\n",
    "    return a * b\n",
    "\n",
    "def parsing_multiplier(string):\n",
    "    a, b = string.split(\",\")\n",
    "    return multiplier(int(a), int(b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6db1d43f",
   "metadata": {},
   "outputs": [],
   "source": [
    "llm = OpenAI(temperature=0)\n",
    "tools = [\n",
    "    Tool(\n",
    "        name = \"Multiplier\",\n",
    "        func=parsing_multiplier,\n",
    "        description=\"useful for when you need to multiply two numbers together. The input to this tool should be a comma separated list of numbers of length two, representing the two numbers you want to multiply together. For example, `1,2` would be the input if you wanted to multiply 1 by 2.\"\n",
    "    )\n",
    "]\n",
    "mrkl = initialize_agent(tools, llm, agent=\"zero-shot-react-description\", verbose=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "aa25d0ca",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3m I need to multiply two numbers\n",
      "Action: Multiplier\n",
      "Action Input: 3,4\u001b[0m\n",
      "Observation: \u001b[36;1m\u001b[1;3m12\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n",
      "Final Answer: 3 times 4 is 12\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'3 times 4 is 12'"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mrkl.run(\"What is 3 times 4\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7ea340c0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.1"
  },
  "vscode": {
   "interpreter": {
    "hash": "b1677b440931f40d89ef8be7bf03acb108ce003de0ac9b18e8d43753ea2e7103"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
